#include "debug.h"
#include "../DDIC/AllDDIC.h"

/*RM9300 Gamma?????*/
u8 ILI8688_Gamma_r[54]= {
    0x02,0x03, 0x04,0x05, 0x06,0x07, 0x08,0x09, 0x0A,0x0B, 0x0C,0x0D, 0x0E,0x0F, 0x10,0x11,
    0x12,0x13, 0x14,0x15, 0x16,0x17, 0x18,0x19, 0x1A,0x1B, 0x1C,0x1D, 0x1E,0x1F, 0x20,0x21, 0x22,0x23,
	0x24,0x25, 0x26,0x27, 0x28,0x29, 0x2A,0x2B, 0x2C,0x2D, 0x2E,0x2F, 0x30,0x31, 0x32,0x33, 0x34,0x35, 0x36,0x37, 
};
u8 ILI8688_Gamma_g[54]= {   
	  0x38,0x39, 0x3A,0x3B, 0x3C,0x3D, 0x3E,0x3F, 0x40,0x41, 0x42,0x43, 0x44,0x45, 0x46,0x47, 0x48,0x49, 0x4A,0x4B,
	  0x4C,0x4D, 0x4E,0x4F, 0x50,0x51, 0x52,0x53, 0x54,0x55, 0x56,0x57, 0x58,0x59, 0x5A,0x5B, 0x5C,0x5D, 
	  0x5E,0x5F, 0x60,0x61, 0x62,0x63, 0x64,0x65, 0x66,0x67, 0x68,0x69, 0x6A,0x6B, 0x6C,0x6D,
};
u8 ILI8688_Gamma_b[54]={
	  0x6E,0x6F, 0x70,0x71, 0x72,0x73, 0x74,0x75, 0x76,0x77, 0x78,0x79, 0x7A,0x7B, 0x7C,0x7D, 0x7E,0x7F, 0x80,0x81,
	  0x82,0x83, 0x84,0x85, 0x86,0x87, 0x88,0x89, 0x8A,0x8B, 0x8C,0x8D, 0x8E,0x8F, 0x90,0x91, 0x92,0x93, 0x94,0x95,
	  0x96,0x97, 0x98,0x99, 0x9A,0x9B, 0x9C,0x9D, 0x9E,0x9F, 0xA0,0xA1, 0xA2,0xA3
};

u8 ILI8688_otptime=0;
//u8 RM35x_otptime=0;

void ILI8688_Write_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void ILI8688_Read_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void ILI8688_Gamma_OTP_Start(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data,u8 ILI8688_otptime);
void ILI8688_auto_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void ILI8688_GammaW_EN(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);
void ILI8688_Page0(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data);

//----------------------------------------------RM69091----------------------------------------------
void ILI8688_Page0(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 buffer1[5];
	SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0xFFFFD);
	buffer1[0] = 0x04;
	if(buffer[3] == 0x0A)
	{
		buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x00;
		SSD2828_W_Array(SigMode,channel,buffer1,0);
	}
	else if(buffer[3] == 0x00)
	{
		buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x08;
		SSD2828_W_Array(SigMode,channel,buffer1,0);
	}
		else if(buffer[3] == 0x01)
	{
		buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x09;
		SSD2828_W_Array(SigMode,channel,buffer1,0);
	}
		else if(buffer[3] == 0x02)
	{
		buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x0A;
		SSD2828_W_Array(SigMode,channel,buffer1,0);
	}
		else if(buffer[3] == 0x03)
	{
		buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x0B;
		SSD2828_W_Array(SigMode,channel,buffer1,0);
	}

}
void ILI8688_GammaW_EN(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
	u8 buffer1[5];
	SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0xFFFFD);
	delay_ms(5);
	buffer1[0] = 0x04;
	buffer1[1] = 0xFF;
	buffer1[2] = 0x86;
	buffer1[3] = 0x88;
	buffer1[4] = 0x0c;
	SSD2828_W_Array(SigMode,channel,buffer1,0);
	if(buffer[3] == 0x01)
	{
		buffer1[0] = 0x02;
		buffer1[1] = 0x07;
		buffer1[2] = 0x04;
	}
	else if(buffer[3] == 0x02)
	{
		buffer1[0] = 0x02;
		buffer1[1] = 0x07;
		buffer1[2] = 0x84;
	}

	SSD2828_W_Array(SigMode,channel,buffer1,0);
}
void ILI8688_Write_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    u8 buffer1[5];
    SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);	
	//SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data|0x0080);
	// SSD2828_W_Reg(SigMode,channel,0xB7,(LP_B7_Data|0x0010)&0XFFfd);              0000 0000   01 00   000 0
	delay_ms(5);
	buffer1[0] = 0x04;
    if((buffer[3]&0x03) == 0x00)      //Gamma0 
    {  
        buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x08;
    }
    else if((buffer[3]&0x03) == 0x01) //Gamma1
    {  
        buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x09;   
    }
    else if((buffer[3]&0x03) == 0x02) //Gamma2 
    {  
        buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x0a;   
    }
	else if((buffer[3]&0x03) == 0x03) //Gamma3
    {  
        buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x0b;   
    }
		SSD2828_W_Array(SigMode,channel,buffer1,0);
		delay_ms(15);		

    for( i = 0;i<buffer[2]-1;i++) 
    {	 
		 SSD2828_W_Reg(SigMode ,channel,0xBC, 2);//数据长度
		 if     ((buffer[3]&0x70)==0x10) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|ILI8688_Gamma_r[i]);  
		 else if((buffer[3]&0x70)==0x20) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|ILI8688_Gamma_g[i]); 
		 else if((buffer[3]&0x70)==0x30) SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|ILI8688_Gamma_b[i]); 

		delay_ms(3);
    }
		
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    buffer[4] = Uart_Error_None;
    STM2PC_RM671xx(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?Gamma??  :ok  
		//ILI8688_w_end: ;
}

void ILI8688_Read_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
    u8 buffer1[5];
		SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data|0x0080);
	   //SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0XFFFD);
		delay_ms(15);
		buffer1[0] = 0x04;
    if((buffer[3]&0x03) == 0x00)      //Gamma0 
    {  
        buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x08;
    }
    else if((buffer[3]&0x03) == 0x01) //Gamma1
    {  
        buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x09;   
    }
    else if((buffer[3]&0x03) == 0x02) //Gamma2 
    {  
        buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x0a;   
    }
	else if((buffer[3]&0x03) == 0x03) //Gamma3
    {  
        buffer1[1] = 0xFF;
		buffer1[2] = 0x86;
		buffer1[3] = 0x88;
		buffer1[4] = 0x0b;   
    }
	SSD2828_W_Array(SigMode,channel,buffer1,0);
	delay_ms(15);		

    SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data|0x0080); 
    SSD2828_W_Reg(SigMode,channel,0xBC,0x0001);	
    for( i = 0;i<buffer[2]-1;i++)			 	
    {  	
        SSD2828_W_Reg(SigMode,channel,0xC1,0x0002);                                
        buffer1[0] = 0x01;
			  if((buffer[3]&0x80) == 0x80)
				{
			   	buffer1[1] = ((buffer[3]&0x70)==0x10) ? ILI8688_Gamma_r[i] : (((buffer[3]&0x70)==0x20) ? ILI8688_Gamma_g[i] : ILI8688_Gamma_b[i]);
				}
		
        SSD2828_W_Array(SigMode,channel,buffer1,0); 
		delay_us(200);
		//SSD2828_W_Cmd(SigMode,channel,0xFF);
        buffer[4+i]=SSD2828_R_Reg(SigMode,channel,0xFF); 
							
		delay_us(200);				
    }	
    delay_ms(5);
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
    STM2PC_RM671xx(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ??? Gamma??  :ok  
}

void ILI8688_Gamma_OTP_Start(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data,u8 ILI8688_otptime)
{
//    u16 tmp;
    u8 buffer1[6];  
	//SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0010)&0xFFFD);   
	//SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);  
		SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0xFFFFD);
    delay_ms(5);
    buffer1[0] = 0x04;
    buffer1[1] = 0xFF;
  //  buffer1[2] = 0x03;
	buffer1[2] = 0x86;
	buffer1[3] = 0x88;
	buffer1[4] = 0x06;
    SSD2828_W_Array(SigMode,channel,buffer1,0);     // 
//    delay_ms(5);
    buffer1[0] = 0x02;
    buffer1[1] = 0x3D;
	buffer1[2] = 0x01;
	//buffer1[3] = 0x01;
    SSD2828_W_Array(SigMode,channel,buffer1,0);     // 
    buffer1[0] = 0x02;
    buffer1[1] = 0x3c;
    buffer1[2] = 0x01; 
	//buffer1[3] = 0x01;
    SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	buffer1[0] = 0x04;
    buffer1[1] = 0xFF;
    //buffer1[2] = 0x03; 
	buffer1[2] = 0x86;
	buffer1[3] = 0x88;
	buffer1[4] = 0x00;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	buffer1[0] = 0x01;
	buffer1[1] = 0x11;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	delay_ms(200);         // wait for >400 ms   
		
	buffer1[0] = 0x04;
    buffer1[1] = 0xFF;
    //buffer1[2] = 0x03; 
	buffer1[2] = 0x86;
	buffer1[3] = 0x88;
	buffer1[4] = 0x06;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	buffer1[0] = 0x02;
    buffer1[1] = 0x44;
    //buffer1[2] = 0x01; 
	buffer1[2] = 0x55;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	buffer1[0] = 0x02;
    buffer1[1] = 0x45;
    //buffer1[2] = 0x01; 
	buffer1[2] = 0xaa;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	buffer1[0] = 0x02;
    buffer1[1] = 0x46;
    //buffer1[2] = 0x01; 
	buffer1[2] = 0x66;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	buffer1[0] = 0x02;
    buffer1[1] = 0x47;
    //buffer1[2] = 0x01; 
	buffer1[2] = 0xcc;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
    delay_ms(200);         // wait for >400 ms   
	
	buffer1[0] = 0x04;
    buffer1[1] = 0xFF;
   // buffer1[2] = 0x03; 
	buffer1[2] = 0x86;
	buffer1[3] = 0x88;
	buffer1[4] = 0x00;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	buffer1[0] = 0x01;
	buffer1[1] = 0x10;
	SSD2828_W_Array(SigMode,channel,buffer1,0);     //
	delay_ms(1500);         // wait for >400 ms   
    buffer[4] = Uart_Error_Oth;
    STM2PC_RM671xx(pdev,CDC_IN_EP,buffer,buffer[2]+3);           //?? ?OTP??  :ok
}
void ILI8688_auto_Gamma(USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8* buffer,u16 LP_B7_Data,u16 HS_B7_Data)
{
//	u8 buffer1[3];
    //SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);	
		//SSD2828_W_Reg(SigMode,channel,0xB7,LP_B7_Data);
	    SSD2828_W_Reg(SigMode,channel,0xB7,(HS_B7_Data|0x0410)&0XFFFD);	
		delay_ms(5);	

		SSD2828_W_Reg(SigMode,channel,0xBC,0x02);
	
    for( i = 0;i<buffer[2];i++) 
    {	 
            SSD2828_W_Reg(SigMode,channel,0xBF,(u16)(buffer[i+4]<<8)|buffer[i+3]);  

            i++;
            delay_ms(2);
    }				
    SSD2828_W_Reg(SigMode,channel,0xB7,HS_B7_Data);
}


void ProcessForIc63( USB_OTG_CORE_HANDLE *pdev,uint8_t  ep_addr,u8 SigMode ,u8 channel,u8 buffer[],u16 LP_B7_Data,u16 HS_B7_Data)//ADD BY PCS
{
		switch(buffer[1]&0xFF)
		{
			case 0x08:                                      //?Gamma
			ILI8688_Write_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
			break;
			case 0x09:                                      //?Gamma
			ILI8688_Read_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data); 
			break;
			case 0x07:
			ILI8688_Gamma_OTP_Start(pdev,ep_addr,SigMode ,channel,buffer, LP_B7_Data,HS_B7_Data,ILI8688_otptime);//???
			break;
			case 0xDD:           // auto Gamma
			ILI8688_auto_Gamma(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
			break;
			case 0xAA:
			ILI8688_GammaW_EN(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
			break;
			case 0xBB:
			ILI8688_Page0(pdev,ep_addr,SigMode,channel,buffer,LP_B7_Data,HS_B7_Data);
			break;
			default:break;
		}	
	
}





 


